看雪.WiFi万能钥匙 CTF 2017第十五题 点评及解题思路
看雪CTF 2017 比赛进行至第十五题
截止至今天中午12点,第十五题破解人数为 9 人!
防守方 hsadkhk 依然位居首位~
今天是最后一题,攻击方风间仁处于第一位~,kkHAIKE位列第二位。
比赛至此告一段落了,
接下来我们来回顾一下第十五题
看看 看雪评委和出题者是怎么说的ヾ(๑╹◡╹)ノ"。
看雪评委 netwind 点评
题目中的VM是作者设计的一个全新的VM,体积虽小,五脏俱全。VM功能包括反调试、反虚拟机、反 API 断点、导入表保护、OEP 抽取,代码虚拟化、代码乱序、代码拆分、代码混淆;攻方需了解vm的基本知识,识别出各条handler,然后根据各handler序列分析出整个流程;作者同时采用lua脚本来进行代码保护,攻方还需掌握lua反编译知识;在算法上采用了简单的异或算法。此题重在考察选手VM分析能力和LUA反编译能力。
作者简介
demoscene,反病毒工程师,反外挂工程师。
看雪 CTF 2017 第十五题设计思路
一、设计思路
一个专业实用的保护系统应该不仅能防 keygen 还应该能防爆破防代码分析
纵观当前市面上最好的几款保护,使用的技术皆为 RSA 算法+代码虚拟化保护,这是当前最流行,最强的软件保护技术。
题目设计主要考察分析vm的能力,所以不使用复杂的算法,只进行了简单的异或。
根据去年CTF时各位大牛写的分析文章,对VM的弱点进行了修补,增强了VM的强度。
吸收去年CTF其它守护方的设计思路,结合lua脚本,实现双虚拟机保护。
二、设计亮点
1、一个体积虽小,五脏俱全的新VM,非市面上已经被N多人分析过的VM,需要攻击者重新分析,考察分析VM的基本功。
vm实现的功能:反调试、反虚拟机、反 API 断点、导入表保护、OEP 抽取,代码虚拟化、代码乱序、代码拆分、代码混淆。
2、结合 lua 脚本,使用自写虚拟机+lua虚拟机,实现双虚拟机保护。
考察攻击者的 lua 反编译知识。
3、不用使复杂算法,避免算法分析。
三、破解思路
1、由于本题只是对输入进行了简单的异或判断,所以无需费力气分析算法,只要把 vm 流程,各个 handler 分析清楚,找到异或的 key 即可。目前壳处理的指令还比较少,混淆模式也比较简单,所以要理清楚并不难,只是由于大家都第一次接触到此 VM,所以可能需要花点时间。
2、本题算法较简单,主要难点在分析VM和反编译lua脚本上
3、分析vm要求大家了解vm的基本知识,vm的整体框架,流程,然后区分出花掉令和正常的指令,去掉花指令,保留正常指令,识别出各条handler,然后根据各handler序列分析出整个流程
4、反编译lua需要找到lua字节码并保存下来,然后使用网上的方法,进行反编译,这里的难点在于找到 lua_loadbuffer的地址,在此函数里把字节码dump下来即可
四、其它说明
1、CrackMe使用vs2008编译,已在xp,win7 32、 win7 64系统上测试功能正常
2、CrackMe使用自己实现的虚拟机BBProtect加密,之前未曾发在网上,复合题目要求
3、BBProtect 程序在已放到 BBProtect目录里
4、由于加了vm,所以杀软软件可能会报毒,cm没有任何恶意功能,可放心运行
下面选取攻击者 loudy 的破解分析
使用工具:IDA6.8(反汇编分析) python(编程解码) OD(动态调试)
步 骤:
一、定位关键代码
该程序有加壳,但对主要流程影响不大,难点在于分析luajit代码,定位主要流程。只要流程清晰了,该题没有难度,只是简单异或运算。
(1)脱壳
其实也不算真正脱壳,其实就是等程序运行起来后,dump内存镜像。
这样在IDA中可以分析解密后的函数和解密后的字符串,如下图
(2)定位关键点
从IDA的字符串窗口可以看到该程序使用了LuaJIT 2.1.0-beta3 且Lua版本号为Lua 5.1。
通过“main”(调用Lua的main函数)关键字在IDA中定位到如下位置。
其上面从0040103D开始的一大段mov指令实际是在栈中生成了一个luajit的bytecode。
二、解密
通过OD动态加载后,通过识别luajit文件头{0x1b,0x4c,0x4a}提取出该文件。
接下来Google找到luajit-decomp项目源码和LuaJIT-2.1.0-beta3源码,编译luajit,替换luajit-decomp中的对应文件,对提取出的luajit反编译,得到如下结果。
我们主要关注其中的main函数,上面已经用c语法注释出来。其实就是对输入分别与下面这一串异或,返回结果。
[112,101,100,105,121,49,50,51,52,53,54,55]
接下来0040222C处的代码取得lua输出的每一个值分别与下面这一串值异或。
[0x5,0x12,0xa,0x29,0x42,0x41,0x75,0x61,0x35,0x83,0x55,0x94]
接下来004022F0处,异或后的值分别与下面着串值比较,相等则注册成功。
[0x18,0x16,0x1e,0x2f,0x48,0x11,0x21,0x37,0x33,0x86,0x52,0x94]
那么python编写如下代码,即可得到真正注册码“maposafe2017”。
全文完,注册码“maposafe2017”。
最后感谢 WiFi 万能钥匙安全应急响应中心的赞助支持,
接下来的比赛大家一定要使出洪荒之力哦!↖(^ω^)↗
比心 ❤
上海连尚网络科技有限公司成立于 2013 年,是一家专注于提供免费上网和内容服务的移动互联网企业。连尚网络自主研发的核心产品 WiFi 万能钥匙,以分享经济的模式,通过云计算和大数据技术,利用热点主人分享的闲置WiFi资源,为用户提供免费、稳定、安全的上网服务,以帮助更多的人上网,找到属于他们的机会,改变自己的命运。
往期热门内容推荐
更多比赛详情,长按下方二维码,“关注看雪学院公众号”查看!
看雪论坛:http://bbs.pediy.com/
微信公众号 ID:ikanxue
微博:看雪安全
商务合作:wsc@kanxue.com
点